home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_11_03 / 1103021a < prev    next >
Text File  |  1993-01-04  |  3KB  |  123 lines

  1. /* _Gentime function */
  2. #include "xtime.h"
  3.  
  4.         /* macros */
  5. #define SUNDAY    0    /* codes for tm_wday */
  6. #define MONDAY    1
  7.  
  8. static char *getval(char *s, int val, int n)
  9.     {    /* convert a decimal value */
  10.     if (val < 0)
  11.         val = 0;
  12.     for (s += n, *s = '\0'; 0 <= --n; val /= 10)
  13.         *--s = val % 10 + '0';
  14.     return (s);
  15.     }
  16.  
  17. static int wkyr(int wstart, int wday, int yday)
  18.     {    /* find week of year */
  19.     wday = (wday + 7 - wstart) % 7;
  20.     return (yday - wday + 12) / 7 - 1;
  21.     }
  22.  
  23. const char *_Gentime(const struct tm *t,
  24.     _Tinfo *tin, const char *s, int *pn, char *ac)
  25.     {    /* format a time field */
  26.     const char *p;
  27.  
  28.     switch (*s++)
  29.         {    /* switch on conversion specifier */
  30.     case 'a':    /* put short weekday name */
  31.         p = _Gettime(tin->_Days, t->tm_wday << 1, pn);
  32.         break;
  33.     case 'A':    /* put full weekday name */
  34.         p = _Gettime(tin->_Days,
  35.             (t->tm_wday << 1) + 1, pn);
  36.         break;
  37.     case 'b':    /* put short month name */
  38.         p = _Gettime(tin->_Months,
  39.             t->tm_mon << 1, pn);
  40.         break;
  41.     case 'B':    /* put full month name */
  42.         p = _Gettime(tin->_Months,
  43.             (t->tm_mon << 1) + 1, pn);
  44.         break;
  45.     case 'c':    /* put date and time */
  46.         p = _Gettime(tin->_Formats, 0, pn),
  47.             *pn = -*pn;
  48.         break;
  49.     case 'd':    /* put day of month, from 01 */
  50.         p = getval(ac, t->tm_mday, *pn = 2);
  51.         break;
  52.     case 'D':    /* put day of month, from 1 */
  53.         p = getval(ac, t->tm_mday, *pn = 2);
  54.         if (ac[0] == '0')
  55.             ac[0] = ' ';
  56.         break;
  57.     case 'H':    /* put hour of 24-hour day */
  58.         p = getval(ac, t->tm_hour, *pn = 2);
  59.         break;
  60.     case 'I':    /* put hour of 12-hour day */
  61.         p = getval(ac, t->tm_hour % 12, *pn = 2);
  62.         break;
  63.     case 'j':    /* put day of year, from 001 */
  64.         p = getval(ac, t->tm_yday + 1, *pn = 3);
  65.         break;
  66.     case 'm':    /* put month of year, from 01 */
  67.         p = getval(ac, t->tm_mon + 1, *pn = 2);
  68.         break;
  69.     case 'M':    /* put minutes after the hour */
  70.         p = getval(ac, t->tm_min, *pn = 2);
  71.         break;
  72.     case 'p':    /* put AM/PM */
  73.         p = _Gettime(tin->_Ampm, 12 <= t->tm_hour,
  74.             pn);
  75.         break;
  76.     case 'S':    /* put seconds after the minute */
  77.         p = getval(ac, t->tm_sec, *pn = 2);
  78.         break;
  79.     case 'U':    /* put Sunday week of the year */
  80.         p = getval(ac,
  81.             wkyr(SUNDAY, t->tm_wday, t->tm_yday),
  82.             *pn = 2);
  83.         break;
  84.     case 'w':    /* put day of week, from Sunday */
  85.         p = getval(ac, t->tm_wday, *pn = 1);
  86.         break;
  87.     case 'W':    /* put Monday week of the year */
  88.         p = getval(ac,
  89.             wkyr(MONDAY, t->tm_wday, t->tm_yday),
  90.             *pn = 2);
  91.         break;
  92.     case 'x':    /* put date */
  93.         p = _Gettime(tin->_Formats, 1, pn),
  94.             *pn = -*pn;
  95.         break;
  96.     case 'X':    /* put time */
  97.         p = _Gettime(tin->_Formats, 2, pn),
  98.             *pn = -*pn;
  99.         break;
  100.     case 'y':    /* put year of the century */
  101.         p = getval(ac, t->tm_year % 100, *pn = 2);
  102.         break;
  103.     case 'Y':    /* put year */
  104.         p = getval(ac, t->tm_year + 1900, *pn = 4);
  105.         break;
  106.     case 'Z':    /* put time zone name */
  107.         if (tin->_Tzone[0] == '\0')
  108.             tin->_Tzone = _Getzone(); /* adapt zone */
  109.         p = _Gettime(tin->_Tzone, 0 < t->tm_isdst,
  110.             pn);
  111.         break;
  112.     case '%':    /* put "%" */
  113.         p = "%", *pn = 1;
  114.         break;
  115.     default:    /* unknown field, print it */
  116.         p = s - 1, *pn = 2;
  117.         }
  118.     return (p);
  119.     }
  120.  
  121.  
  122.  
  123.